package edu.upn.evolucion.proventas.datos;

import edu.upn.evolucion.proventas.entidades.DetalleCompra;
import edu.upn.evolucion.proventas.entidades.DetalleVenta;
import edu.upn.evolucion.proventas.entidades.Producto;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

public class ProductoDAO {
    private static ProductoDAO instancia;

    private ProductoDAO() {
    }
    
    public static ProductoDAO obtenerInstancia() {
        if (instancia == null) {
            instancia = new ProductoDAO();
        }
        return instancia;
    }
    public void registrar(Producto objProducto) {
        Connection con = ConnectionManager.getConnection();
        try {
            Statement stmt = con.createStatement();
            //3. Crear Sentencias SQL
            String insert = ""
                    + "INSERT INTO producto(nombre, precioCompra, precioVenta, cantidad, marca, idProveedor, idCategoria, idUnidadMedida) "
                    + "VALUES(" 
                    + "'" + objProducto.getNombre()+ "', "
                    + objProducto.getPrecioCompra() + ", "
                    + objProducto.getPrecioVenta() + ", "
                    + objProducto.getCantidad() + ", "
                    + "'" + objProducto.getMarca()+ "', "
                    + objProducto.getIdProveedor() + ", "
                    + objProducto.getIdCategoria() + ", "
                    + objProducto.getIdUnidadMedida() + ")";
            stmt.executeUpdate(insert);
            //4. ResultSet
            //5. Cerrar conexion
            stmt.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
        }
    }
    
    public void modificar(Producto objProducto) {
        Connection con = ConnectionManager.getConnection();
        try {
           
            Statement stmt = con.createStatement();
            //3. Crear Sentencias SQL
            String update = ""
                    + "update producto set "
                    + "nombre = '" + objProducto.getNombre() + "', "
                    + "precioCompra = " + objProducto.getPrecioCompra() + ", "
                    + "precioVenta = " + objProducto.getPrecioVenta() + ", "
                    + "cantidad = " + objProducto.getCantidad() + ", "
                    + "marca = '" + objProducto.getMarca() + "', "
                    + "idCategoria = " + objProducto.getIdCategoria() + ", "
                    + "idUnidadMedida = " + objProducto.getIdUnidadMedida() + " where id = " + objProducto.getId();
            stmt.executeUpdate(update);
            
            //4. ResultSet
            //5. Cerrar conexion
            stmt.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
        }
    }
    
    public void Update(DetalleVenta objDetalleVenta) {
        Connection con = ConnectionManager.getConnection();
        try {
           
            Statement stmt = con.createStatement();
            //3. Crear Sentencias SQL
            String update = ""
                    + "update producto set cantidad = cantidad - "+objDetalleVenta.getCantidad()+" where id = " + objDetalleVenta.getIdProducto();
                stmt.executeUpdate(update);
            
            //4. ResultSet
            //5. Cerrar conexion
            stmt.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
        }
    }
    public void Update(DetalleCompra objDetalleCompra) {
        Connection con = ConnectionManager.getConnection();
        try {
           
            Statement stmt = con.createStatement();
            //3. Crear Sentencias SQL
            String update = ""
                    + "update producto p set p.cantidad = p.cantidad + "+objDetalleCompra.getCantidad()+" where p.id = " + objDetalleCompra.getIdProducto();
                stmt.executeUpdate(update);
            
            //4. ResultSet
            //5. Cerrar conexion
            stmt.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
        }
    }
    
    public String eliminar(int idProducto) {
        
        Connection con = ConnectionManager.getConnection();
        try {
            
            //2. Crear Statement JDBC
            Statement stmt = con.createStatement();
            //3. Crear Sentencias SQL
            //String delete = "delete from telefonoEmpleado where idEmpleado = " + idEmpleado;
            //stmt.executeUpdate(delete); 
            
            String delete = "delete from producto where id = " + idProducto;
            stmt.executeUpdate(delete); 
            
            //5. Cerrar conexion
            stmt.close();
            return "Producto eliminado"; 
        } catch (Exception e) {
            e.printStackTrace();
            return "Error al eliminar producto"; 
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
        }
    }
    
    public ArrayList<Producto> buscar(Producto objProducto) {
        Connection con = ConnectionManager.getConnection();
        try {
            
            //2. Crear Statement JDBC
            Statement stmt = con.createStatement();
            //3. Crear Sentencias SQL
            //Un objeto ResultSet, almacena los datos de resultados de una consulta
            ResultSet tabla = stmt.executeQuery("SELECT p.id, p.nombre, p.precioCompra, p.precioVenta, p.cantidad, p.marca, p.idProveedor, p.idCategoria, p.idUnidadMedida "
                                            + "FROM Producto p "
                                            + "WHERE p.nombre like '%"+objProducto.getNombre() +"%' ORDER BY p.id");
            
            //System.out.println("Codigo\tNombre");
            ArrayList<Producto> coleccion = new ArrayList<Producto>();
            while(tabla.next()){
                Producto obj = new Producto();
                obj.setId(tabla.getInt(1));
                obj.setNombre(tabla.getString(2));
                obj.setPrecioCompra(tabla.getBigDecimal(3));
                obj.setPrecioVenta(tabla.getBigDecimal(4));
                obj.setCantidad(tabla.getInt(5));
                obj.setMarca(tabla.getString(6));
                obj.setIdProveedor(tabla.getInt(7));
                obj.setIdCategoria(tabla.getInt(8));
                obj.setIdUnidadMedida(tabla.getInt(9));
                coleccion.add(obj);
                //System.out.println(tabla.getInt(1)+"\t"+tabla.getString(2));
            }
            //4. ResultSet
            //5. Cerrar conexion
            stmt.close();
            return coleccion;
        } catch (Exception e) {
            e.printStackTrace(); 
            ArrayList<Producto> p = new ArrayList<Producto>();
            return p;
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
        }
    }
    
    public ArrayList<Producto> buscar() {
        Connection con = ConnectionManager.getConnection();
        try {
            
            //2. Crear Statement JDBC
            Statement stmt = con.createStatement();
            //3. Crear Sentencias SQL
            //Un objeto ResultSet, almacena los datos de resultados de una consulta
            ResultSet tabla = stmt.executeQuery("SELECT p.id, p.nombre, p.precioCompra, p.precioVenta, p.cantidad, p.marca, p.idProveedor, p.idCategoria, p.idUnidadMedida "
                                            + "FROM Producto p "
                                            + " ORDER BY p.id");
            
            //System.out.println("Codigo\tNombre");
            ArrayList<Producto> coleccion = new ArrayList<Producto>();
            while(tabla.next()){
                Producto obj = new Producto();
                obj.setId(tabla.getInt(1));
                obj.setNombre(tabla.getString(2));
                obj.setPrecioCompra(tabla.getBigDecimal(3));
                obj.setPrecioVenta(tabla.getBigDecimal(4));
                obj.setCantidad(tabla.getInt(5));
                obj.setMarca(tabla.getString(6));
                obj.setIdProveedor(tabla.getInt(7));
                obj.setIdCategoria(tabla.getInt(8));
                obj.setIdUnidadMedida(tabla.getInt(9));
                coleccion.add(obj);
                //System.out.println(tabla.getInt(1)+"\t"+tabla.getString(2));
            }
            //4. ResultSet
            //5. Cerrar conexion
            stmt.close();
            return coleccion;
        } catch (Exception e) {
            e.printStackTrace(); 
            ArrayList<Producto> p = new ArrayList<Producto>();
            return p;
        } finally {
            try {
                con.close();
            } catch (Exception e) {
            }
        }
    }
}